package com.misyi.designpattern.decorator;

/**
 * 装饰器模式
 *
 * @author licong
 * @date 2021-09-14 下午11:25
 */
public class DecoratorPatternDemo {

    public static void main(String[] args) {
        Decorator decorator = new Decorator(new ConcreteComponent());
        decorator.execute();
        decorator.executePlus();

        // 装饰器模式和代理模式的区别:
        // 1. 装饰器模式关注于在一个对象上动态的添加方法，然而代理模式关注于控制对对象的访问
        // 2. 装饰器模式需要调用方将原始对象作为一个参数传递给装饰者的构造器, 操作的还是对象本身,
        // 3. 代理模式对客户隐藏了代理对象的具体信息, 在代理类中创建对象的实例
    }



    public interface Component {
        void execute();
    }
    
    public static class ConcreteComponent implements Component {

        @Override
        public void execute() {
            System.out.println("执行组件逻辑");
        }
    }
    
    public static class Decorator implements Component {
        
        private Component component;

        public Decorator(Component component) {
            this.component = component;
        }

        @Override
        public void execute() {
            System.out.println("装饰器在方法之前进行功能增强!");
            component.execute();
            System.out.println("装饰器在方法之后进行功能增强!");
        }
        
        public void executePlus() {
            System.out.println("拓展被装饰对象的功能");
        }
    }

}
